#include "dht11.h"
#include "tim.h"
#include "gpio.h" 
#include "mqttclient.h"
#include <stdlib.h>

uint8_t Read_Byte(void)
{
	uint8_t i,j;
	for (j=0;j<8;j++)
	{
		while (!(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4))); 
		
		Delay_us (38); 
		
		if ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)) == 0)   // if the pin is low 
		{
			i&= ~(1<<(7-j));   // write 0
		}
		else i|= (1<<(7-j));  // if the pin is high, write 1
		while ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)));  // wait for the pin to go low
		//publish("topic2","aaa",0);
	}
	return i;
}

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{
	set_gpio_output ();  
	HAL_GPIO_WritePin (GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);   
	Delay_us(18000);
	HAL_GPIO_WritePin (GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
	Delay_us (30);
	set_gpio_input ();  
	if (!(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)))  
	{
    while (!(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)));
	  while ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_4)));
			DHT11_Data->humi_int= Read_Byte();
			DHT11_Data->humi_deci= Read_Byte();
			DHT11_Data->temp_int= Read_Byte();
			DHT11_Data->temp_deci= Read_Byte();
			DHT11_Data->check_sum= Read_Byte();
			set_gpio_output ();
			HAL_GPIO_WritePin (GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
	}else{		
			return 1;}
	if((DHT11_Data->humi_int+DHT11_Data->humi_deci+DHT11_Data->temp_int+DHT11_Data->temp_deci)!=DHT11_Data->check_sum)
		return 1;
	return 0;	    
}

int getdistance(void)
{
	int time_us=0;
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
	Delay_us(2);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
	Delay_us(10);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
	while (!(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)));
	HAL_TIM_Base_Start(&htim3);
	__HAL_TIM_SET_AUTORELOAD ( &htim3,0xffff);
  __HAL_TIM_SET_COUNTER (&htim3,1);
	while ((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)));
	time_us=__HAL_TIM_GET_COUNTER (&htim3);
	__HAL_TIM_SET_AUTORELOAD ( &htim3,1);
	HAL_TIM_Base_Stop(&htim3);
	return time_us;
}



















